home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML Authority.sea / XML Authority / Required / swingall.jar / javax / swing / text / Bidi.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-07-15  |  25.6 KB  |  773 lines

  1. package javax.swing.text;
  2.  
  3. final class Bidi {
  4.    private boolean ltr;
  5.    private byte[] dirs;
  6.    private byte[] levels;
  7.    private int[] l2vMap;
  8.    private int[] v2lMap;
  9.    // $FF: renamed from: L byte
  10.    static final byte field_0 = 0;
  11.    // $FF: renamed from: R byte
  12.    static final byte field_1 = 1;
  13.    // $FF: renamed from: EN byte
  14.    static final byte field_2 = 2;
  15.    // $FF: renamed from: ES byte
  16.    static final byte field_3 = 3;
  17.    // $FF: renamed from: ET byte
  18.    static final byte field_4 = 4;
  19.    // $FF: renamed from: AN byte
  20.    static final byte field_5 = 5;
  21.    // $FF: renamed from: CS byte
  22.    static final byte field_6 = 6;
  23.    // $FF: renamed from: B byte
  24.    static final byte field_7 = 7;
  25.    // $FF: renamed from: S byte
  26.    static final byte field_8 = 8;
  27.    // $FF: renamed from: WS byte
  28.    static final byte field_9 = 9;
  29.    // $FF: renamed from: ON byte
  30.    static final byte field_10 = 10;
  31.    // $FF: renamed from: AR byte
  32.    static final byte field_11 = 11;
  33.    // $FF: renamed from: CM byte
  34.    static final byte field_12 = 12;
  35.    // $FF: renamed from: F byte
  36.    static final byte field_13 = 13;
  37.    static final char LRM = '\u200e';
  38.    static final char RLM = '\u200f';
  39.    static final char LRE = '\u202a';
  40.    static final char RLE = '\u202b';
  41.    static final char PDF = '\u202c';
  42.    static final char LRO = '\u202d';
  43.    static final char RLO = '\u202e';
  44.    static final char NUMLEVELS = '\u0010';
  45.    private static byte[] dirIndices = new byte[]{14, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, -124, 14, 18, 15, 16, 17, 18, 19, 20, 21, 22, 23, 14, 24, 25, 26, 27, 14, 28, 29, 30, -104, 14, 14, 2, 31, 32, 33, 34, 35, 36, 37, 38, 14, 39, 14, 40, 41, -106, 14, 8, 42, 43, 44, 45, 46, 47, 48, 49, -76, 14, -2, 2, -91, 2, 1, 50, -104, 14, -41, 2, 1, 51, -60, 2, 12, 52, 14, 53, 54, 55, 55, 56, 57, 58, 59, 60, 61};
  46.    private static byte[] dirValues = new byte[]{-119, 10, 5, 8, 7, 8, 7, 7, -114, 10, -125, 7, 4, 8, 9, 10, 10, -125, 4, -123, 10, 5, 4, 6, 4, 6, 3, -118, 2, 1, 6, -122, 10, -102, 0, -122, 10, -102, 0, -91, 10, 2, 9, 10, -124, 4, -124, 10, 1, 0, -123, 10, 6, 4, 4, 2, 2, 10, 0, -125, 10, 2, 2, 0, -123, 10, -105, 0, 1, 10, -97, 0, 1, 10, -2, 0, -2, 0, 2, 0, 0, -124, 10, -98, 0, -72, 10, -39, 0, -121, 10, -119, 0, 2, 10, 10, -121, 0, -98, 10, -123, 0, -101, 10, -58, 12, -102, 10, 2, 12, 12, -110, 10, 2, 0, 0, -124, 10, 1, 0, -117, 10, 2, 0, 10, -125, 0, 3, 10, 0, 10, -108, 0, 1, 10, -84, 0, 1, 10, -121, 0, -125, 10, 8, 0, 10, 0, 10, 0, 10, 0, 10, -110, 0, -115, 10, -116, 0, 1, 10, -62, 0, 1, 10, -116, 0, 1, 10, -91, 0, -124, 12, -119, 10, -75, 0, 8, 10, 10, 0, 0, 10, 10, 0, 0, -125, 10, -100, 0, 2, 10, 10, -120, 0, 4, 10, 10, 0, 0, -73, 10, -90, 0, 2, 10, 10, -121, 0, 1, 10, -89, 0, 2, 10, 0, -121, 10, -111, 12, 1, 10, -105, 12, 1, 10, -125, 12, 7, 1, 12, 1, 12, 12, 1, 12, -117, 10, -101, 1, -123, 10, -123, 1, -105, 10, 1, 6, -114, 10, 1, 11, -125, 10, 2, 11, 10, -102, 11, -123, 10, -117, 11, -120, 12, -115, 10, -118, 5, 7, 4, 5, 5, 11, 10, 10, 12, -57, 11, 2, 10, 10, -123, 11, 1, 10, -113, 11, 1, 10, -122, 11, -113, 12, 5, 11, 11, 12, 12, 10, -124, 12, 2, 10, 10, -118, 2, -2, 10, -119, 10, 4, 12, 12, 0, 10, -75, 0, 3, 10, 10, 12, -124, 0, -120, 12, -124, 0, 4, 12, 10, 10, 0, -124, 12, -125, 10, -118, 0, 2, 12, 12, -115, 0, -112, 10, 4, 12, 0, 0, 10, -120, 0, 6, 10, 10, 0, 0, 10, 10, -106, 0, 1, 10, -121, 0, 2, 10, 0, -125, 10, -124, 0, 4, 10, 10, 12, 10, -125, 0, -124, 12, 9, 10, 10, 0, 0, 10, 10, 0, 0, 12, -119, 10, 1, 0, -124, 10, 3, 0, 0, 10, -125, 0, 4, 12, 12, 10, 10, -116, 0, 2, 4, 4, -121, 0, -121, 10, 3, 12, 10, 10, -122, 0, -124, 10, 4, 0, 0, 10, 10, -106, 0, 1, 10, -121, 0, 13, 10, 0, 0, 10, 0, 0, 10, 0, 0, 10, 10, 12, 10, -125, 0, 2, 12, 12, -124, 10, 4, 12, 12, 10, 10, -125, 12, -117, 10, -124, 0, 2, 10, 0, -121, 10, -118, 0, 2, 12, 12, -125, 0, -116, 10, 4, 12, 12, 0, 10, -121, 0, 3, 10, 0, 10, -125, 0, 1, 10, -106, 0, 1, 10, -121, 0, 4, 10, 0, 0, 10, -123, 0, 3, 10, 10, 12, -124, 0, -123, 12, 11, 10, 12, 12, 0, 10, 0, 0, 12, 10, 10, 0, -113, 10, 1, 0, -123, 10, -118, 0, -111, 10, 4, 12, 0, 0, 10, -120, 0, 6, 10, 10, 0, 0, 10, 10, -106, 0, 1, 10, -121, 0, 5, 10, 0, 0, 10, 10, -124, 0, 7, 10, 10, 12, 0, 0, 12, 0, -125, 12, -125, 10, 7, 0, 0, 10, 10, 0, 0, 12, -120, 10, 2, 12, 0, -124, 10, 3, 0, 0, 10, -125, 0, -124, 10, -117, 0, -111, 10, 3, 12, 0, 10, -122, 0, -125, 10, -125, 0, 1, 10, -124, 0, -125, 10, 7, 0, 0, 10, 0, 10, 0, 0, -125, 10, 2, 0, 0, -125, 10, -125, 0, -125, 10, -120, 0, 1, 10, -125, 0, -124, 10, 5, 0, 0, 12, 0, 0, -125, 10, -125, 0, 1, 10, -125, 0, 1, 12, -119, 10, 1, 0, -113, 10, -116, 0, -114, 10, -125, 0, 1, 10, -120, 0, 1, 10, -125, 0, 1, 10, -105, 0, 1, 10, -118, 0, 1, 10, -123, 0, -124, 10, -125, 12, -124, 0, 1, 10, -125, 12, 1, 10, -124, 12, -121, 10, 2, 12, 12, -119, 10, 2, 0, 0, -124, 10, -118, 0, -110, 10, 3, 0, 0, 10, -120, 0, 1, 10, -125, 0, 1, 10, -105, 0, 1, 10, -118, 0, 1, 10, -123, 0, -124, 10, 2, 0, 12, -123, 0, 9, 10, 12, 0, 0, 10, 0, 0, 12, 12, -121, 10, 2, 0, 0, -121, 10, 4, 0, 10, 0, 0, -124, 10, -118, 0, -110, 10, 3, 0, 0, 10, -120, 0, 1, 10, -125, 0, 1, 10, -105, 0, 1, 10, -112, 0, -124, 10, -125, 0, -125, 12, 2, 10, 10, -125, 0, 1, 10, -125, 0, 1, 12, -119, 10, 1, 0, -120, 10, 2, 0, 0, -124, 10, -118, 0, -111, 10, -80, 0, 3, 12, 0, 0, -121, 12, -124, 10, 1, 4, -121, 0, -120, 12, -115, 0, -91, 10, 13, 0, 0, 10, 0, 10, 10, 0, 0, 10, 0, 10, 10, 0, -122, 10, -124, 0, 1, 10, -121, 0, 1, 10, -125, 0, 9, 10, 0, 10, 0, 10, 10, 0, 0, 10, -124, 0, 3, 12, 0, 0, -122, 12, 6, 10, 12, 12, 0, 10, 10, -123, 0, 3, 10, 0, 10, -122, 12, 2, 10, 10, -118, 0, 4, 10, 10, 0, 0, -94, 10, -104, 0, 2, 12, 12, -101, 0, 5, 12, 0, 12, 0, 12, -124, 10, 2, 12, 12, -120, 0, 1, 10, -95, 0, -121, 10, -114, 12, 1, 0, -123, 12, 3, 0, 12, 12, -124, 0, -124, 10, -122, 12, 3, 10, 12, 10, -107, 12, -125, 10, -121, 12, 2, 10, 12, -26, 10, -90, 0, -118, 10, -89, 0, -124, 10, 1, 0, -124, 10, -38, 0, -123, 10, -60, 0, -123, 10, -46, 0, -122, 10, -100, 0, -124, 10, -38, 0, -122, 10, -106, 0, 2, 10, 10, -122, 0, 2, 10, 10, -90, 0, 2, 10, 10, -122, 0, 2, 10, 10, -120, 0, 7, 10, 0, 10, 0, 10, 0, 10, -97, 0, 2, 10, 10, -75, 0, 1, 10, -121, 0, 2, 10, 0, -125, 10, -125, 0, 1, 10, -121, 0, -125, 10, -124, 0, 2, 10, 10, -122, 0, -124, 10, -115, 0, -123, 10, -125, 0, 1, 10, -121, 0, -125, 10, -121, 9, 1, 6, -124, 9, 4, 10, 10, 0, 1, -104, 10, 8, 7, 7, 13, 13, 10, 13, 13, 10, -123, 4, -69, 10, 1, 2, -125, 10, -122, 2, 2, 4, 4, -125, 10, 1, 0, -118, 2, 2, 4, 4, -108, 10, -115, 4, -93, 10, -110, 12, -96, 10, 1, 0, -124, 10, 3, 0, 10, 10, -118, 0, 4, 10, 0, 10, 10, -122, 0, -122, 10, 6, 0, 10, 0, 10, 0, 10, -120, 0, 1, 10, -122, 0, -89, 10, -93, 0, -2, 10, -111, 10, 2, 4, 4, -2, 10, -92, 10, -59, 0, -27, 10, -68, 2, -50, 0, 1, 2, -107, 10, 1, 9, -123, 10, 2, 0, 0, -103, 10, -119, 0, -122, 12, -111, 10, -44, 0, -124, 10, 8, 12, 12, 10, 10, 0, 0, 10, 10, -34, 0, -122, 10, -88, 0, -124, 10, -34, 0, 1, 10, -112, 0, -32, 10, -99, 0, -125, 10, -92, 0, -100, 10, -100, 0, -125, 10, -78, 0, -113, 10, -116, 0, -124, 10, -81, 0, 1, 10, -9, 0, -124, 10, -29, 0, 2, 10, 10, -97, 0, 1, 10, -90, 0, -38, 10, -92, 0, -36, 10, -82, 0, -46, 10, -121, 0, -116, 10, -123, 0, -122, 10, 1, 12, -118, 1, 1, 4, -115, 1, 1, 10, -123, 1, 9, 10, 1, 10, 1, 1, 10, 1, 1, 10, -20, 1, -95, 10, -2, 1, -19, 1, -110, 10, -64, 1, 2, 10, 10, -74, 1, -88, 10, -116, 1, -92, 10, -124, 12, -84, 10, 6, 6, 10, 6, 10, 10, 6, -119, 10, 5, 4, 10, 10, 4, 4, -123, 10, 2, 4, 4, -123, 10, -125, 1, 3, 10, 1, 10, -2, 1, -119, 1, -122, 10, -125, 4, -123, 10, 5, 4, 6, 4, 6, 3, -118, 2, 1, 6, -122, 10, -102, 0, -122, 10, -102, 0, -118, 10, -71, 0, 2, 10, 10, -97, 0, -125, 10, -122, 0, 2, 10, 10, -122, 0, 2, 10, 10, -122, 0, 2, 10, 10, -125, 0, -125, 10, 2, 4, 4, -125, 10, 2, 4, 4, -103, 10};
  47.  
  48.    static {
  49.       dirIndices = RLEUtilities.readRLE(dirIndices);
  50.       dirValues = RLEUtilities.readRLE(dirValues);
  51.    }
  52.  
  53.    Bidi(Bidi var1, int var2, int var3) {
  54.       byte[] var4 = var1.dirs;
  55.       byte[] var5 = createLineLevels(var4, var1.levels, var1.ltr, var2, var3);
  56.       this.ltr = var1.ltr;
  57.       this.dirs = null;
  58.       this.levels = var5;
  59.    }
  60.  
  61.    protected Bidi(byte[] var1, boolean var2) {
  62.       this.ltr = var2;
  63.       this.dirs = null;
  64.       this.levels = var1;
  65.    }
  66.  
  67.    Bidi(byte[] var1, byte[] var2, boolean var3) {
  68.       applyBidiRules(var1, var2, var3);
  69.       this.ltr = var3;
  70.       this.dirs = var1;
  71.       this.levels = var2;
  72.    }
  73.  
  74.    Bidi(char[] var1) {
  75.       this(var1, defaultIsLTR(var1, 0, var1.length));
  76.    }
  77.  
  78.    Bidi(char[] var1, boolean var2) {
  79.       this(var1, getEmbeddingArray(var1, var2), var2);
  80.    }
  81.  
  82.    Bidi(char[] var1, byte[] var2, boolean var3) {
  83.       byte[] var4 = getDirectionCodeArray(var1, var2);
  84.  
  85.       for(int var5 = 0; var5 < var2.length; ++var5) {
  86.          if ((var2[var5] & 16) != 0) {
  87.             var2[var5] = (byte)(var2[var5] & 15);
  88.             var4[var5] = (byte)(var2[var5] & 1);
  89.          }
  90.       }
  91.  
  92.       applyBidiRules(var4, var2, var3);
  93.       this.ltr = var3;
  94.       this.dirs = var4;
  95.       this.levels = var2;
  96.    }
  97.  
  98.    static void applyBidiRules(byte[] var0, byte[] var1, boolean var2) {
  99.       byte[] var3 = (byte[])var0.clone();
  100.       resolveWeakTypes(var3, var1, var2);
  101.       resolveNeutralTypes(var3, var1, var2);
  102.       resolveImplicitLevels(var3, var0, var1, var2);
  103.    }
  104.  
  105.    private static int[] computeContiguousOrder(int[] var0, int var1, int var2) {
  106.       int[] var3 = new int[var2 - var1];
  107.  
  108.       for(int var4 = 0; var4 < var3.length; ++var4) {
  109.          var3[var4] = var4 + var1;
  110.       }
  111.  
  112.       for(int var5 = 0; var5 < var3.length - 1; ++var5) {
  113.          int var6 = var5;
  114.          int var7 = var0[var3[var5]];
  115.  
  116.          for(int var8 = var5; var8 < var3.length; ++var8) {
  117.             if (var0[var3[var8]] < var7) {
  118.                var6 = var8;
  119.                var7 = var0[var3[var8]];
  120.             }
  121.          }
  122.  
  123.          int var9 = var3[var5];
  124.          var3[var5] = var3[var6];
  125.          var3[var6] = var9;
  126.       }
  127.  
  128.       if (var1 != 0) {
  129.          for(int var10 = 0; var10 < var3.length; ++var10) {
  130.             var3[var10] -= var1;
  131.          }
  132.       }
  133.  
  134.       int var11;
  135.       for(var11 = 0; var11 < var3.length && var3[var11] == var11; ++var11) {
  136.       }
  137.  
  138.       if (var11 == var3.length) {
  139.          return null;
  140.       } else {
  141.          return getInverseOrder(var3);
  142.       }
  143.    }
  144.  
  145.    static Bidi createBidi(char[] var0) {
  146.       return new Bidi(var0);
  147.    }
  148.  
  149.    Bidi createLineBidi(int var1, int var2) {
  150.       byte[] var3 = new byte[var2 - var1];
  151.       System.arraycopy(this.levels, var1, var3, 0, var3.length);
  152.       if (this.dirs != null) {
  153.          byte var4 = (byte)(this.ltr ? 0 : 1);
  154.          int var5 = var3.length;
  155.  
  156.          while(true) {
  157.             --var5;
  158.             if (var5 < 0 || var3[var5] % 2 == var4 || this.dirs[var1 + var5] != 9) {
  159.                break;
  160.             }
  161.  
  162.             var3[var5] = var4;
  163.          }
  164.       }
  165.  
  166.       return new Bidi(var3, this.ltr);
  167.    }
  168.  
  169.    static byte[] createLineLevels(byte[] var0, byte[] var1, boolean var2, int var3, int var4) {
  170.       byte[] var5 = new byte[var4 - var3];
  171.       System.arraycopy(var1, var3, var5, 0, var5.length);
  172.       byte var6 = (byte)(var2 ? 0 : 1);
  173.  
  174.       for(int var7 = var4 - var3 - 1; var7 >= 0 && var5[var7] != var6 && var0[var3 + var7] == 9; --var7) {
  175.          var5[var7] = var6;
  176.       }
  177.  
  178.       return var5;
  179.    }
  180.  
  181.    static int[] createVisualToLogicalMap(byte[] var0) {
  182.       int var1 = var0.length;
  183.       int[] var2 = new int[var1];
  184.       byte var3 = 17;
  185.       byte var4 = 0;
  186.  
  187.       for(int var5 = 0; var5 < var1; ++var5) {
  188.          var2[var5] = var5;
  189.          byte var6 = var0[var5];
  190.          if (var6 > var4) {
  191.             var4 = var6;
  192.          }
  193.  
  194.          if ((var6 & 1) != 0 && var6 < var3) {
  195.             var3 = var6;
  196.          }
  197.       }
  198.  
  199.       label59:
  200.       for(; var4 >= var3; --var4) {
  201.          int var10 = 0;
  202.  
  203.          while(true) {
  204.             while(var10 >= var1 || var0[var10] >= var4) {
  205.                int var7 = var10++;
  206.                if (var7 == var0.length) {
  207.                   continue label59;
  208.                }
  209.  
  210.                while(var10 < var1 && var0[var10] >= var4) {
  211.                   ++var10;
  212.                }
  213.  
  214.                for(int var8 = var10 - 1; var7 < var8; --var8) {
  215.                   int var9 = var2[var7];
  216.                   var2[var7] = var2[var8];
  217.                   var2[var8] = var9;
  218.                   ++var7;
  219.                }
  220.             }
  221.  
  222.             ++var10;
  223.          }
  224.       }
  225.  
  226.       return var2;
  227.    }
  228.  
  229.    static boolean defaultIsLTR(char[] var0, int var1, int var2) {
  230.       while(var1 < var2) {
  231.          char var3 = var0[var1++];
  232.          byte var4 = getDirectionCode(var3);
  233.          switch (var4) {
  234.             case 0:
  235.                return true;
  236.             case 1:
  237.             case 11:
  238.                return false;
  239.             case 13:
  240.                return var3 == 8237 || var3 == 8234;
  241.          }
  242.       }
  243.  
  244.       return true;
  245.    }
  246.  
  247.    static int[] getContiguousOrder(int[] var0) {
  248.       return var0 != null ? computeContiguousOrder(var0, 0, var0.length) : null;
  249.    }
  250.  
  251.    static byte getDirectionCode(char var0) {
  252.       return dirValues[(dirIndices[var0 >> 7] << 7) + (var0 & 127)];
  253.    }
  254.  
  255.    static byte[] getDirectionCodeArray(char[] var0, byte[] var1) {
  256.       byte var2 = 10;
  257.       byte var3 = -1;
  258.       byte[] var4 = new byte[var0.length];
  259.  
  260.       for(int var5 = 0; var5 < var0.length; ++var5) {
  261.          if (var1[var5] != var3) {
  262.             var2 = 10;
  263.             var3 = var1[var5];
  264.          }
  265.  
  266.          char var6 = var0[var5];
  267.          byte var7 = getDirectionCode(var6);
  268.          switch (var7) {
  269.             case 0:
  270.             case 1:
  271.             case 11:
  272.                var2 = var7;
  273.             case 2:
  274.             case 3:
  275.             case 4:
  276.             case 5:
  277.             case 6:
  278.             case 8:
  279.             case 9:
  280.             case 10:
  281.             default:
  282.                break;
  283.             case 7:
  284.                var2 = 10;
  285.                break;
  286.             case 12:
  287.                var7 = var2;
  288.                break;
  289.             case 13:
  290.                var7 = 10;
  291.          }
  292.  
  293.          var4[var5] = var7;
  294.       }
  295.  
  296.       return var4;
  297.    }
  298.  
  299.    static byte[] getEmbeddingArray(char[] var0, boolean var1) {
  300.       byte[] var2 = new byte[var0.length];
  301.       byte var3 = (byte)(var1 ? 0 : 1);
  302.       byte var4 = var3;
  303.       int var5 = 0;
  304.       int var6 = 0;
  305.       byte[] var7 = new byte[16];
  306.       char[] var8 = new char[16];
  307.  
  308.       for(int var9 = 0; var9 < var0.length; ++var9) {
  309.          char var10 = var0[var9];
  310.          switch (var10) {
  311.             case '\u202a':
  312.             case '\u202d':
  313.                if (var6 > 0) {
  314.                   ++var6;
  315.                } else {
  316.                   byte var12 = (byte)((var4 & 14) + 2);
  317.                   if (var12 < 16) {
  318.                      var8[var5] = var10;
  319.                      var7[var5++] = var4;
  320.                      var2[var9] = var4;
  321.                      if (var10 == 8237) {
  322.                         var4 = (byte)(var12 + 16);
  323.                      } else {
  324.                         var4 = var12;
  325.                      }
  326.                      continue;
  327.                   }
  328.  
  329.                   ++var6;
  330.                }
  331.                break;
  332.             case '\u202b':
  333.             case '\u202e':
  334.                if (var6 > 0) {
  335.                   ++var6;
  336.                } else {
  337.                   byte var11 = (byte)((var4 & 15) + 1 | 1);
  338.                   if (var11 < 16) {
  339.                      var8[var5] = var10;
  340.                      var7[var5++] = var4;
  341.                      var2[var9] = var4;
  342.                      if (var10 == 8238) {
  343.                         var4 = (byte)(var11 + 16);
  344.                      } else {
  345.                         var4 = var11;
  346.                      }
  347.                      continue;
  348.                   }
  349.  
  350.                   ++var6;
  351.                }
  352.                break;
  353.             case '\u202c':
  354.                if (var6 > 0) {
  355.                   --var6;
  356.                } else if (var5 > 0) {
  357.                   if (var9 < var0.length - 1 && var0[var9 + 1] == var8[var5 - 1]) {
  358.                      var2[var9] = var4;
  359.                      var2[var9 + 1] = var4;
  360.                      ++var9;
  361.                      continue;
  362.                   }
  363.  
  364.                   --var5;
  365.                   var4 = var7[var5];
  366.                }
  367.          }
  368.  
  369.          var2[var9] = var4;
  370.       }
  371.  
  372.       return var2;
  373.    }
  374.  
  375.    static int[] getInverseOrder(int[] var0) {
  376.       if (var0 == null) {
  377.          return null;
  378.       } else {
  379.          int[] var1 = new int[var0.length];
  380.  
  381.          for(int var2 = 0; var2 < var0.length; var1[var0[var2]] = var2++) {
  382.          }
  383.  
  384.          return var1;
  385.       }
  386.    }
  387.  
  388.    int getLength() {
  389.       return this.levels.length;
  390.    }
  391.  
  392.    int getLevelAt(int var1) {
  393.       return this.levels[var1];
  394.    }
  395.  
  396.    int getLevelLimit(int var1) {
  397.       byte var2 = this.levels[var1];
  398.  
  399.       do {
  400.          ++var1;
  401.       } while(var1 < this.levels.length && this.levels[var1] == var2);
  402.  
  403.       return var1;
  404.    }
  405.  
  406.    byte[] getLevels() {
  407.       return this.levels;
  408.    }
  409.  
  410.    int[] getLogicalToVisualMap() {
  411.       if (this.l2vMap == null) {
  412.          this.l2vMap = getInverseOrder(this.getVisualToLogicalMap());
  413.       }
  414.  
  415.       return this.l2vMap;
  416.    }
  417.  
  418.    static int[] getNormalizedOrder(int[] var0, byte[] var1, int var2, int var3) {
  419.       if (var0 != null) {
  420.          if (var2 == 0 && var3 == var0.length) {
  421.             return var0;
  422.          } else {
  423.             boolean var4;
  424.             boolean var5;
  425.             byte var6;
  426.             if (var1 == null) {
  427.                var6 = 0;
  428.                var4 = true;
  429.                var5 = true;
  430.             } else if (var1[var2] == var1[var3 - 1]) {
  431.                var6 = var1[var2];
  432.                var5 = (var6 & 1) == 0;
  433.  
  434.                int var7;
  435.                for(var7 = var2; var7 < var3 && var1[var7] >= var6; ++var7) {
  436.                   if (var5) {
  437.                      var5 = var1[var7] == var6;
  438.                   }
  439.                }
  440.  
  441.                var4 = var7 == var3;
  442.             } else {
  443.                var4 = false;
  444.                var6 = 0;
  445.                var5 = false;
  446.             }
  447.  
  448.             if (!var4) {
  449.                return computeContiguousOrder(var0, var2, var3);
  450.             } else if (var5) {
  451.                return null;
  452.             } else {
  453.                int[] var10 = new int[var3 - var2];
  454.                int var8;
  455.                if ((var6 & 1) != 0) {
  456.                   var8 = var0[var3 - 1];
  457.                } else {
  458.                   var8 = var0[var2];
  459.                }
  460.  
  461.                if (var8 == 0) {
  462.                   System.arraycopy(var0, var2, var10, 0, var3 - var2);
  463.                } else {
  464.                   for(int var9 = 0; var9 < var10.length; ++var9) {
  465.                      var10[var9] = var0[var9 + var2] - var8;
  466.                   }
  467.                }
  468.  
  469.                return var10;
  470.             }
  471.          }
  472.       } else {
  473.          return null;
  474.       }
  475.    }
  476.  
  477.    int[] getVisualToLogicalMap() {
  478.       if (this.v2lMap == null) {
  479.          this.v2lMap = createVisualToLogicalMap(this.levels);
  480.       }
  481.  
  482.       return this.v2lMap;
  483.    }
  484.  
  485.    boolean isDirectionLTR() {
  486.       return this.ltr;
  487.    }
  488.  
  489.    static void reorderVisually(byte[] var0, Object[] var1) {
  490.       int var2 = var0.length;
  491.       byte var3 = 17;
  492.       byte var4 = 0;
  493.  
  494.       for(int var5 = 0; var5 < var2; ++var5) {
  495.          byte var6 = var0[var5];
  496.          if (var6 > var4) {
  497.             var4 = var6;
  498.          }
  499.  
  500.          if ((var6 & 1) != 0 && var6 < var3) {
  501.             var3 = var6;
  502.          }
  503.       }
  504.  
  505.       label59:
  506.       for(; var4 >= var3; --var4) {
  507.          int var10 = 0;
  508.  
  509.          while(true) {
  510.             while(var10 >= var2 || var0[var10] >= var4) {
  511.                int var7 = var10++;
  512.                if (var7 == var0.length) {
  513.                   continue label59;
  514.                }
  515.  
  516.                while(var10 < var2 && var0[var10] >= var4) {
  517.                   ++var10;
  518.                }
  519.  
  520.                for(int var8 = var10 - 1; var7 < var8; --var8) {
  521.                   Object var9 = var1[var7];
  522.                   var1[var7] = var1[var8];
  523.                   var1[var8] = var9;
  524.                   ++var7;
  525.                }
  526.             }
  527.  
  528.             ++var10;
  529.          }
  530.       }
  531.  
  532.    }
  533.  
  534.    static boolean requiresBidi(char var0) {
  535.       if (var0 < 1425) {
  536.          return false;
  537.       } else if (var0 > 8238) {
  538.          return false;
  539.       } else {
  540.          byte var1 = getDirectionCode(var0);
  541.          return var1 == 1 || var1 == 11 || var1 == 13;
  542.       }
  543.    }
  544.  
  545.    private static void resolveImplicitLevels(byte[] var0, byte[] var1, byte[] var2, boolean var3) {
  546.       byte var4 = (byte)(var3 ? 0 : 1);
  547.       int var5 = var0.length;
  548.       byte var6 = -1;
  549.  
  550.       for(int var7 = 0; var7 < var5; ++var7) {
  551.          byte var8 = var2[var7];
  552.          byte var9 = var8;
  553.          switch (var0[var7]) {
  554.             case 0:
  555.                var9 = (byte)(var8 + 1 & 30);
  556.                break;
  557.             case 1:
  558.             case 11:
  559.                var9 = (byte)(var8 | 1);
  560.                break;
  561.             case 2:
  562.                if ((var8 & 1) != 0) {
  563.                   var9 = (byte)(var8 + 1);
  564.                } else if (var7 != 0 && var6 == var8) {
  565.                   byte var12 = var0[var7 - 1];
  566.                   if (var12 == 2) {
  567.                      var9 = var2[var7 - 1];
  568.                   } else if (var12 != 0) {
  569.                      var9 = (byte)(var8 + 2);
  570.                   }
  571.                }
  572.             case 3:
  573.             case 4:
  574.             case 6:
  575.             case 9:
  576.             case 10:
  577.             default:
  578.                break;
  579.             case 5:
  580.                var9 = (byte)((var8 & 14) + 2);
  581.                break;
  582.             case 7:
  583.             case 8:
  584.                var9 = var4;
  585.  
  586.                for(int var10 = var7 - 1; var10 >= 0 && var1[var10] == 9; --var10) {
  587.                   var2[var10] = var4;
  588.                }
  589.          }
  590.  
  591.          if (var9 != var8) {
  592.             var2[var7] = var9;
  593.          }
  594.  
  595.          var6 = var8;
  596.       }
  597.  
  598.       for(int var11 = var5 - 1; var11 >= 0 && var1[var11] == 9; --var11) {
  599.          var2[var11] = var4;
  600.       }
  601.  
  602.    }
  603.  
  604.    private static void resolveNeutralTypes(byte[] var0, byte[] var1, boolean var2) {
  605.       int var3 = 0;
  606.       int var4 = var0.length;
  607.  
  608.       while(var3 < var4) {
  609.          byte var5 = var1[var3];
  610.          int var6 = (var5 & 1) == 0 ? 0 : 1;
  611.  
  612.          int var7;
  613.          for(var7 = var3 + 1; var7 < var4 && var1[var7] == var5; ++var7) {
  614.          }
  615.  
  616.          int var8 = var6;
  617.          int var9 = var6;
  618.  
  619.          for(int var10 = var3 - 1; var3 < var7; ++var3) {
  620.             byte var11 = var0[var3];
  621.             switch (var11) {
  622.                case 0:
  623.                   var8 = 0;
  624.                   continue;
  625.                case 1:
  626.                case 11:
  627.                   var8 = 1;
  628.                case 2:
  629.                case 3:
  630.                case 4:
  631.                case 5:
  632.                case 6:
  633.                default:
  634.                   continue;
  635.                case 7:
  636.                case 8:
  637.                   var8 = var6;
  638.                   continue;
  639.                case 9:
  640.                case 10:
  641.                case 12:
  642.             }
  643.  
  644.             if (var3 > var10) {
  645.                var9 = var6;
  646.                var10 = var3 + 1;
  647.  
  648.                label66:
  649.                while(var10 < var7) {
  650.                   byte var12 = var0[var10];
  651.                   switch (var12) {
  652.                      case 0:
  653.                         var9 = var8 == 0 ? 0 : var6;
  654.                         break label66;
  655.                      case 1:
  656.                      case 5:
  657.                      case 11:
  658.                         var9 = var8 == 0 ? var6 : 1;
  659.                         break label66;
  660.                      case 2:
  661.                         var9 = var8;
  662.                         break label66;
  663.                      case 3:
  664.                      case 4:
  665.                      case 6:
  666.                      case 7:
  667.                      case 9:
  668.                      case 10:
  669.                      default:
  670.                         ++var10;
  671.                         break;
  672.                      case 8:
  673.                         var9 = var6;
  674.                         break label66;
  675.                   }
  676.                }
  677.             }
  678.  
  679.             var0[var3] = (byte)var9;
  680.          }
  681.       }
  682.  
  683.    }
  684.  
  685.    private static void resolveWeakTypes(byte[] var0, byte[] var1, boolean var2) {
  686.       int var3 = 0;
  687.       int var4 = 0;
  688.  
  689.       while(var4 < var0.length) {
  690.          for(byte var5 = var1[var4++]; var4 < var0.length && var1[var4] == var5; ++var4) {
  691.          }
  692.  
  693.          int var6 = -1;
  694.          byte var7 = var0[var3];
  695.  
  696.          byte var10;
  697.          for(boolean var8 = var7 == 11; var3 < var4; var7 = var10) {
  698.             int var9 = var3 + 1;
  699.             var10 = var9 == var4 ? -1 : var0[var9];
  700.             if (var10 == 2 && var8) {
  701.                var10 = 5;
  702.             }
  703.  
  704.             int var11;
  705.             var11 = var7;
  706.             label87:
  707.             switch (var7) {
  708.                case 0:
  709.                case 1:
  710.                   var8 = false;
  711.                case 2:
  712.                case 5:
  713.                case 7:
  714.                case 8:
  715.                case 9:
  716.                case 10:
  717.                default:
  718.                   break;
  719.                case 3:
  720.                   if (var6 == 2 && var10 == 2) {
  721.                      var11 = 2;
  722.                      break;
  723.                   }
  724.  
  725.                   var11 = 10;
  726.                   break;
  727.                case 4:
  728.                   if (var6 != 2 && var10 != 2) {
  729.                      if (var10 == 4 && !var8) {
  730.                         for(int var12 = var9 + 1; var12 < var4; ++var12) {
  731.                            byte var13 = var0[var12];
  732.                            if (var13 != 4) {
  733.                               int var14;
  734.                               for(var14 = var13 == 2 ? 2 : 10; var9 < var12; var0[var9++] = (byte)var14) {
  735.                               }
  736.  
  737.                               var11 = var14;
  738.                               var10 = var13;
  739.                               break label87;
  740.                            }
  741.                         }
  742.                      } else {
  743.                         var11 = 10;
  744.                      }
  745.                   } else {
  746.                      var11 = 2;
  747.                   }
  748.                   break;
  749.                case 6:
  750.                   if (var6 == 2 && var10 == 2) {
  751.                      var11 = 2;
  752.                   } else {
  753.                      if (var6 == 5 && var10 == 5) {
  754.                         var11 = 5;
  755.                         break;
  756.                      }
  757.  
  758.                      var11 = 10;
  759.                   }
  760.                   break;
  761.                case 11:
  762.                   var8 = true;
  763.             }
  764.  
  765.             var0[var3] = (byte)var11;
  766.             var3 = var9;
  767.             var6 = var11;
  768.          }
  769.       }
  770.  
  771.    }
  772. }
  773.